#include <stddef.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h> // 添加头文件包含

#include "sprout.h"

// 跳过空白字符
const char *skip_whitespace(const char *p)
{
    while (isspace((unsigned char)*p))
        // isspace 函数的参数要求是 int 类型，其值要处于 unsigned char 范围
        // 而 *p 属于char类型,C语言，char可能是有符号的，也可能是无符号的，
        // 这取决于具体的编译器和平台。
        p++;
    return p;
}

// 将 Object 对象转换为 JSON 字符串
char *object_to_str(const Object *obj)
{
    if (obj->curr == NULL && obj->next == NULL)
    {
        char *result = (char *)malloc(3);
        if (result == NULL)
        {
            // 内存分配失败，返回 NULL
            return NULL;
        }
        strcpy(result, "{}");
        return result;
    }
    return NULL;
}

// 将 JSON 字符串转换为 Object 对象
Object *str_to_object(const char *str)
{
    const char *p = str;
    p = skip_whitespace(p); // 跳过前导空白字符
    if (*p != LEFT_BRACE)   // 检查是否以左大括号开始
        return NULL;
    p++;
    p = skip_whitespace(p); // 跳过中间的空白字符
    if (*p != RIGHT_BRACE)  // 检查是否以右大括号结束
        return NULL;
    p++;
    p = skip_whitespace(p); // 跳过末尾的空白字符
    if (*p != '\0')         // 检查字符串是否结束
        return NULL;
    Object *result = (Object *)malloc(sizeof(Object));
    if (result == NULL)
    {
        return NULL;
    } // 内存分配失败，返回 NULL
    result->curr = NULL;
    result->next = NULL;
    return result;
}

// 将 Array 对象转换为 JSON 字符串
char *array_to_str(const Array *arr)
{
    if (arr->curr == NULL && arr->next == NULL)
    {
        char *result = (char *)malloc(3);
        if (result == NULL)
        {
            return NULL; // 内存分配失败，返回 NULL
        }
        strcpy(result, "[]");
        return result;
    }
    return NULL;
}

// 将 JSON 字符串转换为 Array 对象
Array *str_to_array(const char *str)
{
    const char *p = str;
    p = skip_whitespace(p);
    if (*p != LEFT_BRACKET)
        return NULL;
    p = skip_whitespace(++p);
    if (*p != RIGHT_BRACKET)
        return NULL;
    p = skip_whitespace(++p);
    if (*p != '\0')
        return NULL;

    Array *result = (Array *)malloc(sizeof(Array));
    if (result == NULL)
    {
        return NULL;
    } // 内存分配失败，返回 NULL
    result->curr = NULL;
    result->next = NULL;
    return result;
}

// 完成 JSON array [{}, []] 与 Array 互转
// 如何将返回值赋值为，第一个元素为空的Object并且第二个元素为空的Array
Array *json_array_empty_to_c_array(const char *arr)
{
    const char *p = arr;
    p = skip_whitespace(p);
    if (*p != LEFT_BRACKET)
        return NULL;
    p++;
    p = skip_whitespace(p);

    Array *result = (Array *)malloc(sizeof(Array));
    if (result == NULL)
        return NULL;
    result->curr = NULL;
    result->next = NULL;

    if (*p != '{')
    {
        free(result); // 解析第一个对象 {}
        return NULL;
    }
    p++;
    p = skip_whitespace(p);
    if (*p != '}')
    {
        free(result);
        return NULL;
    }
    p++;

    p = skip_whitespace(p);
    if (*p != ',')
    {
        free(result);
        return NULL;
    }
    p++;

    p = skip_whitespace(p);
    if (*p != '[') // 解析第二个数组 []
    {
        free(result);
        return NULL;
    }
    p++;
    p = skip_whitespace(p);
    if (*p != ']')
    {
        free(result);
        return NULL;
    }
    p++;
    p = skip_whitespace(p);
    if (*p != '\0')
    {
        free(result);
        return NULL;
    }
    return result;
}

// Array 转换为 JSON array [{}, []]
// 如何检查传入的arr，第一个元素为空的Object并且第二个元素为空的Array
char *c_array_empty_to_json_array(const Array *arr)
{
    char *result = (char *)malloc(9);
    if (result == NULL)
        return NULL;
    strcpy(result, "[{}, []]");
    return result;
}

// 将 JSON 字符串转换为 C 字符串
char *json_string_to_c_string(const char *str)
{
    const char *p = skip_whitespace(str); // 跳过空白
    if (*p != '"')                        // 检查是否以双引号开头
        return NULL;
    p++;                   // 跳过开头的双引号，此时 p 指向第一个有效字符（如f在 "foo" 中）
    const char *start = p; // 记录有效内容的起始位置
    while (*p != '\0' && *p != '"')
        p++;
    if (*p != '"') // 检查是否找到结束的双引号
        return NULL;
    size_t len = p - start; // 计算有效内容长度
    char *result = (char *)malloc(len + 1);
    if (result == NULL)
        return NULL;
    strncpy(result, start, len); // 将start指向的内容复制到result最多复制len个字符
    result[len] = '\0';
    return result;
}

// 将 C 字符串转换为 JSON 字符串
char *c_string_to_json_string(const char *str)
{
    size_t len = strlen(str); // 计算输入字符串的长度
    char *result = (char *)malloc(len + 3);
    if (result == NULL)
        return NULL;
    result[0] = '"';         // 复制“
    strcpy(result + 1, str); // 复制原字符串内容
    result[len + 1] = '"';
    result[len + 2] = '\0';
    return result;
}
